home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 6 / QRZ Ham Radio Callsign Database - Volume 6.iso / mac / files / amiga / csrc720j.lzh / mbfile.c < prev    next >
C/C++ Source or Header  |  1993-08-12  |  12KB  |  635 lines

  1. /*
  2.  *  MBFILE.C - 6/20/89
  3.  */
  4.  
  5. #include "mb.h"
  6.  
  7. #ifdef MCH_AMIGA
  8. extern char passchr,vhfstream,hfstream;
  9. extern short debug,interflag;
  10. extern DIRPATH *setdir();
  11. #endif
  12.  
  13. word filesize;
  14. char *fm;
  15. DIRPATH *dphd;
  16.  
  17. /*
  18.  *  Prepend path given by opt2 to file spec given by p.
  19.  */
  20.  
  21. DIRPATH *getdir(p)
  22. char *p;
  23. {
  24.   register DIRPATH *dp;
  25.  
  26.   for (dp = dphd; dp isnt NULL; dp = dp->next) if (dp->id is port->opt2)
  27.   {
  28.     strcpy(port->line, dp->path);
  29. #ifdef MCH_AMIGA
  30.       /* Insert a '/' if sysop didn't specify it in the config file */
  31.       if(*p && (port->line[strlen(port->line)-1] != '/'))
  32.          strcat(port->line,"/");
  33. #endif
  34.     strcat(port->line, p);
  35.     if (!(port->mode & p_sysop)) for (; *p; p++)
  36.       if ((*p is ':') or (*p is '\\') or (*p is '/'))
  37.       { port->msg = mcant; return NULL; }
  38.     return dp;
  39.   }
  40.   port->msg = mndir;
  41.   return NULL;
  42. }
  43.  
  44. /*
  45.  *  Display the directory paths.
  46.  */
  47.  
  48. shpaths()
  49. {
  50.   register DIRPATH *dp;
  51.   int crcount = 1;
  52.  
  53.   sprintf(port->line, "Use %c and directory ID (i.e. %cA):\n",
  54.   port->opt1, port->opt1);
  55.   outstr(port->line);
  56.   for (dp = dphd; dp isnt NULL; dp = dp->next)
  57.   {
  58.     ++crcount;
  59.     sprintf(port->line, "%c %-36s", dp->id, dp->name);
  60.     outstr(port->line);
  61.     if (crcount % 2) outstr("\n"); else outstr(" ");
  62.   }
  63.   outstr("\n");
  64. }
  65.  
  66. /*
  67.  *  Display directory.
  68.  */
  69.  
  70. prtdir()
  71. {
  72.   DIRDEF dirdef;
  73.   DIRENT *dp;
  74.  
  75.   register short gap, i, k, l, ndir;
  76. #ifndef MCH_AMIGA
  77.   register word totsize;
  78. #else
  79.   register long totsize;
  80. #endif
  81.  
  82.   if (port->mode & ops)
  83.   {
  84.     if (port->opt2 is ' ')
  85.     {
  86.       if (port->flds is 1) { shpaths(); return; }
  87.       strcpy(port->line, port->fld[1]);
  88.     }
  89. #ifndef MCH_AMIGA
  90.     else if (getdir(port->fld[1]) is NULL) return;
  91. #else
  92.     else if(setdir(port->fld[1]) is NULL) return;
  93. #endif
  94.   }
  95.   else
  96.   {
  97.     if (port->opt2 is ' ') { shpaths(); return; }
  98. #ifndef MCH_AMIGA
  99.     if (getdir(port->fld[1]) is NULL) return;
  100. #else
  101.     if(setdir(port->fld[1]) is NULL) return;
  102. #endif
  103.   }
  104.  
  105.   ndir = 0;
  106.   dp = (DIRENT *)tmp->scr;
  107.  
  108. /*
  109.  *  Get first directory entry.
  110.  */
  111.  
  112.   if (!diropen(port->line, dp, &dirdef)) { port->msg = mfind; return; }
  113.  
  114. /*
  115.  *  Get the rest of the directory entries.
  116.  */
  117.  
  118.   while ((ndir < dirmax) and (dp->size >= 0))
  119.   {
  120.     ndir++;
  121.     dirnext(++dp, &dirdef);
  122.   }
  123.  
  124. /*
  125.  *  Sort 'em.
  126.  */
  127.  
  128. #ifndef MCH_AMIGA
  129.   sort(tmp->scr, ndir, sizeof(DIRENT), tmp->scr + (sizeof(DIRENT) * ndir));
  130. #else
  131.   sort(tmp->scr, ndir, (short)sizeof(DIRENT), tmp->scr + (sizeof(DIRENT) * ndir));
  132. #endif
  133.  
  134. /*
  135.  *  Print 'em.
  136.  */
  137.  
  138.   outchar('\n');
  139.   totsize = 0;
  140.   gap = (ndir + 2) / 3;
  141.   for (i = 0; i < gap; i++)
  142.   {
  143.     if (pgck() is 'Q') break;
  144.     for (l = 0, k = i; (l < 4) and (k < ndir); l++, k += gap)
  145.     {
  146.       totsize += tmp->dirent[k].size;
  147. #ifndef MCH_AMIGA
  148.       if (k isnt i) outstr(" | ");
  149. #else
  150. /* The | symbol could be the streamswitch char so check for it and
  151.    pass it if necessary
  152. */
  153.       if(k isnt i) {
  154.          if(passchr && ((vhfstream == '|') || (hfstream == '|'))) {
  155.             outchar(' ');
  156.             outchar(passchr);
  157.             outstr("| ");
  158.          }
  159.          else {
  160.             outstr(" | ");
  161.          }
  162.       }
  163. #endif
  164.       sprintf (port->line,
  165.    "%-12s %4uk", tmp->dirent[k].name, tmp->dirent[k].size);
  166.       outstr(port->line);
  167.     }
  168.     outchar('\n');
  169.   }
  170.  
  171. #ifndef MCH_AMIGA
  172.   sprintf(port->line, "\n%uk of %uk used, %uk free.\n\n",
  173. #else
  174.    /* %lu makes no difference in Manx */
  175.   sprintf(port->line, "\n%ldk of %ldk used, %ldk free.\n\n",
  176. #endif
  177.     totsize, dirdef.size, dirdef.free);
  178.   outstr(port->line);
  179. }
  180.  
  181. /*
  182.  *  Output a line from the help file.
  183.  */
  184.  
  185. helpo()
  186. {
  187.   if ((*port->line isnt '!') or (port->user->options & u_sysop))
  188.   { if (*port->line is '!') *port->line = ' '; outstr(port->line); }
  189. }
  190.  
  191. /*
  192.  *  Find specific subject header in file.
  193.  */
  194.  
  195. helps()
  196. {
  197.   register short found = false;
  198.  
  199.   while (!found and (fgets(port->line, linelen, port->fl) isnt NULL))
  200.     if ((port->line[0] is port->opt1) and
  201.    (port->line[2] is port->opt2)) found = true;
  202.  
  203.   if (!found)
  204.   {
  205.     sprintf(port->line, "\nNo help for - %c\n\n", port->opt2);
  206.     port->msg = port->line;
  207.     return;
  208.   }
  209.  
  210.   found = false;
  211.   while (!found and (fgets(port->line, linelen, port->fl) isnt NULL))
  212.   {
  213.     found = ((*port->line is '#') or (*port->line is '?'));
  214.     if (!found) helpo();
  215.   }
  216. }
  217.  
  218. /*
  219.  *  Dump all the help information.
  220.  */
  221.  
  222. helpa()
  223. {
  224.   register short ok = false;
  225.  
  226.   while ((fgets(port->line, linelen, port->fl) isnt NULL))
  227.   {
  228.     if ((*port->line is '#') or (*port->line is '?'))
  229.     {
  230.       ok = (*port->line is port->opt1);
  231.     }
  232.     else if (ok) helpo();
  233.   }
  234. }
  235.  
  236. /*
  237.  *  User wants help.
  238.  */
  239.  
  240. help()
  241. {
  242.   if (port->flds is 1) port->opt2 = '_'; else port->opt2 = *port->fld[1];
  243.   if (port->opt1 is 'H') port->opt1 = '#';
  244.  
  245.   if ((port->fl = fopen(helpfile, "r")) is NULL) { port->msg = mfind; return; }
  246.  
  247.   if (port->opt2 is '?') helpa(); else helps();
  248.  
  249.   fclose(port->fl);
  250. }
  251.  
  252. /*
  253.  *  N command, rename a file.
  254.  */
  255.  
  256. renfil()
  257. {
  258.   register int fl;
  259.  
  260.   if ((fl = open(port->fld[1], O_RDONLY)) < 0)
  261.     { nofile(port->fld[1]); return; }
  262.  
  263.   close(fl);
  264.  
  265.   if ((fl = open(port->fld[2], O_RDONLY)) >= 0)
  266.     { close(fl); port->msg = mexst; }
  267.   else rename (port->fld[1], port->fld[2]);
  268. }
  269.  
  270. /*
  271.  *  Z command, delete a file.
  272.  */
  273.  
  274. kilfil()
  275. {
  276.   if (port->opt2 is ' ') strcpy(port->line, port->fld[1]);
  277.   else if (getdir(port->fld[1]) is NULL) return;
  278.  
  279.   if (!unlink(port->line)) port->msg = mdone; else nofile(port->line);
  280. }
  281.  
  282. /*
  283.  *  Are the two files in the same directory?
  284.  */
  285.  
  286. samedir(t, f)
  287. char *t, *f;
  288. {
  289.   register char *te, *fe;
  290.  
  291. /*
  292.  *  Are they on the same device?
  293.  */
  294.  
  295.   te = strchr(t, ':');
  296.   fe = strchr(f, ':');
  297.   if ((te isnt NULL) or (fe isnt NULL))
  298.   {
  299.     if ((te - t) isnt (fe - f)) return false;
  300.     if (!matchn(te, fe, (int)(fe - f) + 1)) return false;
  301.   }
  302.  
  303. /*
  304.  *  Are they in the same subdirectory on the device?
  305.  */
  306.  
  307. #ifndef MCH_AMIGA
  308.   te = strrchr(t, '\\');
  309.   fe = strrchr(f, '\\');
  310. #else
  311.   te = strrchr(t, '/');
  312.   fe = strrchr(f, '/');
  313. #endif
  314.   if ((te is NULL) and (fe is NULL)) return true;
  315.   if ((te - t) isnt (fe - f)) return false;
  316.   return matchn(t, f, (int)(fe - f) + 1);
  317. }
  318.  
  319. /*
  320.  *  Copy a file.
  321.  */
  322.  
  323. copy(f, t, h)
  324. char *f, *t;
  325. int h;
  326. {
  327.   register int n, in, out;
  328.  
  329.   filesize = 0;
  330.  
  331.   if ((in = open(f, O_RDONLY | O_BINARY)) < 0) return false;
  332.  
  333.   out = open(t, O_CREAT | O_RDWR | O_BINARY, pmode);
  334.   if (h) lseek(out, (long)RECSIZE, 0);
  335.  
  336.   while ((n = read(in, tmp->scr, scrmax)) > 0)
  337.   { filesize += n; write (out, tmp->scr, n); }
  338.  
  339.   close(in);
  340.   close(out);
  341.   return true;
  342. }
  343.  
  344. /*
  345.  *  V command: copy a file.
  346.  */
  347.  
  348. copfil()
  349. {
  350.   register int n;
  351.  
  352.   if ((n = open(port->fld[2], O_RDONLY | O_BINARY)) >= 0)
  353.   { port->msg = mexst; close(n); return; }
  354.  
  355.   if ((n = open(port->fld[1], O_RDONLY | O_BINARY)) < 0)
  356.     { nofile(port->fld[1]); return;}
  357.  
  358.   close(n);
  359.   copy(port->fld[1], port->fld[2], false);
  360. }
  361.  
  362. /*
  363.  *  Upload, common code.
  364.  */
  365.  
  366. uload(tname)
  367. char *tname;
  368. {
  369.   register char *tp;
  370.   register PORTS *p;
  371.  
  372.   p = port;
  373.  
  374.   if ((p->fl = fopen(tname, "w")) is NULL) { p->msg = mcant; return; }
  375.  
  376.   filesize = 0;
  377.   while (true)
  378.   {
  379.     while(!getdat());
  380.  
  381. /*
  382.  *  If user disconnected, timed out, or forced off, zap the file.
  383.  */
  384.  
  385.     if (p->mode & gone)
  386.     {
  387.       fclose(p->fl);
  388.       unlink(tname);
  389.       return;
  390.     }
  391.  
  392.     if ((tp = strchr(p->line, cpmeof)) is NULL)
  393.     {
  394.       filesize += strlen(p->line);
  395.       fputs(p->line, p->fl);
  396.     }
  397.     else
  398.     {
  399.       if (tp isnt p->line)
  400.       {
  401.    *tp++ = '\n';
  402.    *tp   = '\0';
  403.    filesize += strlen(p->line);
  404.    fputs(p->line, p->fl);
  405.       }
  406.       fclose(p->fl);
  407.       return;
  408.     }
  409.   }
  410. }
  411.  
  412. /*
  413.  *  Upload a file, from local console and remote sysop.
  414.  */
  415.  
  416. uloadl()
  417. {
  418.   if ((port->fl = fopen(port->fld[1], "r")) isnt NULL)
  419.     { port->msg = mexst; fclose(port->fl); return; }
  420.   prtx(fm);
  421.   uload(port->fld[1]);
  422. }
  423.  
  424. /*
  425.  *  Upload a file, from logged in user.
  426.  */
  427.  
  428. uloadr()
  429. {
  430.   register DIRPATH *dp;
  431.  
  432.   if (port->opt2 is ' ') { shpaths(); return; }
  433.   if ((dp = getdir(port->fld[1])) is NULL) return;
  434.   if (!(dp->flags & dp_upload)) { port->msg = mcant; return; }
  435.   if (!(port->priv & p_upload)) { port->msg = mcant; return; }
  436.   if ((port->fl = fopen(port->line, "r")) isnt NULL)
  437.     { port->msg = mexst; fclose(port->fl); return; }
  438.   log('F', 'U', ' ', port->line);
  439.   prtx(fm);
  440.   uload(port->line);
  441. }
  442.  
  443. /*
  444.  *  Download, common code.
  445.  */
  446.  
  447. dload(fname)
  448. char *fname;
  449. {
  450.   if ((port->fl = fopen(fname, "r")) is NULL) { nofile(fname); return; }
  451. #ifdef MCH_AMIGA
  452.    interflag = 0;
  453. #endif
  454.   while(fgets(tmp->scr, scrmax, port->fl) isnt NULL)
  455.   {
  456.      if (chkdis()) break;
  457. #ifdef MCH_AMIGA
  458.       if(interflag && (port != cport)) {
  459.       /* If the serial port was interrupted by the user then stop. */
  460.          fclose(port->fl);
  461.          return;
  462.       }
  463.       /* Remove any offending graphics or control characters before sending
  464.          the string to the screen and do the outstr anyway
  465.       */
  466.       str_search(tmp->scr);
  467. #else
  468.      outstr(tmp->scr);
  469. #endif
  470.   }
  471.   fclose (port->fl);
  472. }
  473.  
  474. /*
  475.  *  Display the "info" file.
  476.  */
  477.  
  478. dloadi()
  479. {
  480.   dload(infofile);
  481. }
  482.  
  483.  
  484. /*
  485.  *  Download a file, by logged in user.
  486.  */
  487.  
  488. dloadr()
  489. {
  490.   register DIRPATH *dp;
  491.  
  492.   if (port->opt2 is ' ') { shpaths(); return; }
  493.   if ((dp = getdir(port->fld[1])) is NULL) return;
  494.   if (!(dp->flags & dp_dnload)) { port->msg = mcant; return; }
  495.   if (!(port->priv & p_dnload)) { port->msg = mcant; return; }
  496.   log('F', 'D', ' ', port->line);
  497.   dload(port->line);
  498. }
  499.  
  500. /*
  501.  *  Download a file, by remote sysop.
  502.  */
  503.  
  504. dloads()
  505. {
  506.   if (port->opt2 is ' ')
  507.   {
  508.     if (port->flds is 1) { shpaths(); return; }
  509.     strcpy(port->line, port->fld[1]);
  510.   }
  511.   else if (getdir(port->fld[1]) is NULL) return;
  512.  
  513.   log('F', 'D', ' ', port->line);
  514.   dload(port->line);
  515. }
  516.  
  517. /*
  518.  *  Download a file, by local console.
  519.  */
  520.  
  521. dloadl()
  522. {
  523.   register PORTS *tp;
  524.  
  525.   if (port->opt2 is ' ') port->opt2 = 'Z';
  526.   if ((tp = findport(port->opt2)) is NULL) { port->msg = mnport; return; }
  527.   if ((cport->fl = fopen(cport->fld[1], "r")) is NULL)
  528.     { nofile(cport->fld[1]); return; }
  529.  
  530.   ioport(tp);
  531.   pgst(NULL);
  532.   while(fgets(tmp->scr, scrmax, cport->fl) isnt NULL)
  533.   {
  534. #ifdef MCH_AMIGA
  535.       str_search(tmp->scr);
  536. #else
  537.     outstr(tmp->scr);
  538. #endif
  539.     if (pgck() is 'Q') break;
  540.   }
  541.   fclose (cport->fl);
  542.   if (tp isnt cport) term(tp);
  543.   ioport(cport);
  544. }
  545.  
  546. /*
  547.  *  Move killed mail over to a subdirectory if it exists. NTS for all
  548.  *  type 'T' and 'S' mail. Sysop's call for all to and from the sysop
  549.  *  and KILL for non-bbs mail.
  550.  */
  551.  
  552. arcmsg()
  553. {
  554.   register int n, in, out;
  555.   static char bbs[8];
  556.   FILE *index;
  557.  
  558.   msgfile(port->line, port->mmhs->number);
  559.   strcpy(bbs, "KILL");
  560.  
  561.   if (*port->mmhs->bbs isnt ' ')
  562.     unbl(bbs, port->mmhs->bbs, ln_call);
  563.   if ((matchn(port->mmhs->to, cport->user->call, ln_call)) or
  564.     (matchn(port->mmhs->from, cport->user->call, ln_call)))
  565.     unbl(bbs, cport->user->call, ln_call);
  566.   if ((port->mmhs->type is 'T') or (port->mmhs->type is 'S'))
  567.     strcpy(bbs, "NTS");
  568.   if (port->mmhs->stat & m_busy) strcpy( bbs, "BUSY");
  569.   if (port->mmhs->stat & m_noarc) strcpy(bbs, "NOARC");
  570.  
  571.   while (true)
  572.   {
  573. #ifndef MCH_AMIGA
  574.     sprintf(port->cmd, "%s%s\\%u", msgdir, bbs, port->mmhs->number);
  575. #else
  576.     sprintf(port->cmd, "%s%s/%u", msgdir, bbs, port->mmhs->number);
  577. #endif
  578.  
  579.     if ((out = open(port->cmd, O_CREAT | O_RDWR | O_BINARY, pmode)) < 0)
  580.     {
  581.       if((matchn(bbs, "KILL", 4)) or (matchn(bbs, "BUSY", 4))
  582.        or (port->mmhs->stat & m_noarc))
  583.       {
  584.     unlink(port->line);
  585.     outstr(" Deleted\n");
  586.     return;
  587.       }
  588.       strcpy(bbs, "KILL");
  589.     }
  590.     else break;
  591.   }
  592.   makehdr();
  593. #ifndef MCH_AMIGA
  594.   sprintf(port->cmd, "%s%s\\INDEX", msgdir, bbs);
  595. #else
  596.   sprintf(port->cmd, "%s%s/INDEX", msgdir, bbs);
  597. #endif
  598.   if ((index = fopen(port->cmd, "a+")) isnt NULL)
  599.   {
  600.     fprintf( index, "%s", tmp->scr);
  601.     fclose(index);
  602.   }
  603. #ifndef MCH_AMIGA
  604.   remnl (tmp->scr);
  605.   strcat (tmp->scr, "\r\n");
  606. #endif
  607.  
  608.   if (*port->mmhs->bid isnt ' ') {
  609. #ifndef MCH_AMIGA
  610.     sprintf(port->cmd, "   BID: -%12.12s\r\n", port->mmhs->bid);
  611. #else
  612.     sprintf(port->cmd, "   BID: -%12.12s\n", port->mmhs->bid);
  613. #endif
  614.     strcat(tmp->scr, port->cmd);
  615.     }
  616. #ifndef MCH_AMIGA
  617.   write(out, tmp->scr, strlen(tmp->scr));
  618. #else
  619.    in = strlen(tmp->scr);
  620.   write(out, tmp->scr, in);
  621. #endif
  622.  
  623.   in = open(port->line, O_RDONLY | O_BINARY);
  624.   lseek(in, (long)RECSIZE, 0);
  625.  
  626.   while ((n = read(in, tmp->scr, scrmax)) > 0)
  627.     write( out, tmp->scr, n);
  628.  
  629.   close(out);
  630.   close(in);
  631.   unlink(port->line);
  632.   sprintf(port->line," Copied to %s\n", bbs);
  633.   outstr(port->line);
  634. }
  635.